/*
 * serveur.c
 * projet Unix: 6 qui prend
 *
 *  @authors Doublier Sami
 *  @authors Pingot Alexandre
 */

#include "serveur.h"
#define LOG "log"

security securite;

int main(int argc, char *argv[]) {
	int mySocket;
	struct sockaddr_in adr;
	int port;
	int testFermeture;

	FILE *fichier;
	fichier = securite.log;

	securite.lock = 0;
	securite.log = NULL;

	switch (argc) {
		default:
			fprintf(stderr, "Usage: serveur portHôte [fichier]\n");
			exit(2);
			break;
		case 3:
			if (verifierNumPort(argv[1]) == -1) {
				fprintf(stderr, "Numero de port invalide.\n");
				exit(2);
			}
			if (freopen(argv[2], "w", stderr) == NULL) {
				fprintf(stderr,
						"Erreur lors de l'ouverture du fichier passé en paramètre.\n");
				exit(2);
			}
			break;
		case 2:
			if (verifierNumPort(argv[1]) == 1) {
				fprintf(stderr, "Vous devez choisir un port entre 1025 et 65535.\n");
				exit(2);
			}
			break;
	}

	/*empêche que le serveur soit lançé plusieurs fois*/
	if ((securite.lock = open(LOCK, O_EXCL | O_CREAT, S_IRGRP)) == -1) {
		if (errno == EEXIST) {
			fprintf(stderr, "Un serveur de jeu est dejà en cours d'execution\n");
			exit(SERV_LOCK);
		}
	}

	/**************************************************************************/
	/* initialisation du socket pour l'ecoute du port */
	mySocket = 0;

	/* defini la famille de socket à utiliser */
	adr.sin_family = AF_INET;

	/* initialisation du socket TCP*/
	SYS(mySocket=socket(adr.sin_family, SOCK_STREAM, IPPROTO_TCP));

	/* Récupération de l'adresse ip */
	adr.sin_addr.s_addr = htonl(INADDR_ANY);

	port = atoi(argv[1]);
	/*assignation du port*/
	adr.sin_port = htons(port);

	/**Le socket est créé en prenant les champs de la structure adr.
	 * En cas d'erreur on ferme le socket du serveur et on sort du programme.
	 */
	if (bind(mySocket, (struct sockaddr *) &adr, sizeof(struct sockaddr_in)) < 0) {
		fprintf(stderr,
				"Impossible de lier le socket au couple adresse hôte et port\n");
		SYS(close(mySocket));
		exit(3);
	}

	/* Limitation du nombre de joueurs à MAX_JOUEURS */
	if (listen(mySocket, MAX_JOUEURS) < 0) {
		fprintf(stderr, "Ecoute sur le port impossible\n");
		SYS(close(mySocket));
		exit(4);
	}

	partie(mySocket, securite.lock);

	/* test */
	/*#############Test du atexit pour supprimer les fichiers log et lock#################*/
	testFermeture = atexit(effacerFichiers);
	if (testFermeture != 0) {
		fprintf(stderr, "Problème lors de l'appel de la fonction atexit().\n");
		return EXIT_FAILURE;
	}
	/*#####################################################################################*/

	exit(4);
}

/*#############Test du atexit pour supprimer les fichiers log et lock#################*/
void effacerFichiers() {
	fprintf(stderr, "Suppression des fichiers Lock et Log\n");
	SYS(close(securite.lock));
	fclose(securite.log);
	/*SYS(unlink(LOCK));*/
	/*SYS(unlink(LOG));*/
}

/*#####################################################################################*/

